"""
图书馆小案例:
功能描述:
1. 可以添加书籍
	如果作者存在,书籍存在,不能添加
	如果作者存在,书籍不存在,可以添加
	如果作者不存在, 可以添加
2. 删除书籍
3. 删除作者, 同时删除该作者的所有书籍

思路分析:
1.创建表单wtf
2.配置数据库
3.具体功能操作

"""""


from flask import Flask, render_template, redirect, url_for, flash
from flask_wtf import FlaskForm
# from flask.ext.wtf import FlaskForm# 一样的和上面,多了ext,说明信息
from wtforms import StringField,SubmitField
from wtforms.validators import  DataRequired
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 设置秘钥
app.config['SECRET_KEY']='JIJEECMS'

#自定义表单，继承自FlaskForm
class BookForm(FlaskForm):
    authorName = StringField(label='作者',validators=[DataRequired('作者不能为空')])
    bookName = StringField(label='书籍',validators=[DataRequired('书籍不能为空')])

    submit = SubmitField('添加')

# 设置数据库配置信息
app.config['SQLALCHEMY_DATABASE_URI']="mysql://root:mysql@127.0.0.1:3306/library1"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
# 创建SQLAlchemy对象，关联app
db = SQLAlchemy(app)

# 编写模型类
class Author(db.Model):
    __tablename__= 'authors'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)

    books = db.relationship("Book",backref="author")
class Book(db.Model):
    __tablename__= 'books'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)

    # 外键
    author_id = db.Column(db.Integer,db.ForeignKey('authors.id'))
# 展示页面
@app.route('/')
def show_page():
    # 创建表单
    bookForm = BookForm()

    # 查询数据库
    authors = Author.query.all()

    return  render_template('/file01library.html',bookForm=bookForm,authors=authors)

# 添加书籍
@app.route('/add_book',methods=['POST'])
def add_book():
    # 1.创建表单，通过提交的数据
    bookForm = BookForm()

    # 2.验证参数和功能，validate_on_submit()
    if bookForm.validate_on_submit():
        # 获取参数
        author_name = bookForm.authorName.data
        book_name = bookForm.bookName.data

        # 通过作者名称，查询作者对象
        author= Author.query.filter(Author.name==author_name).first()

        # 判断作者是否存在
        if author:
            book = Book.query.filter(Book.name==book_name,Book.author_id==author.id).first()
            if book:
                flash('该作者有该书')
            else:
                # 创建书籍对象,添加到数据库
                book = Book(name=book_name,author_id=author.id)
                db.session.add(book)
                db.session.commit()
        else:
            # 创建作者对象，添加到数据库
            author =Author(name=author_name)
            db.session.add(author)
            db.session.commit()

            # 创建书籍对象,添加到数据库
            book = Book(name=book_name, author_id=author.id)
            db.session.add(book)
            db.session.commit()

    # 3.重新显示页面
    return redirect(url_for('show_page'))

# 删除书籍
@app.route('/delete_book/<int:book_id>')
def delete_book(book_id):
    # 1.根据编号获取书籍
    book = Book.query.get(book_id)

    # 2.删除书籍
    db.session.delete(book)
    db.session.commit()

    # 3.重定向到页面
    return redirect(url_for('show_page'))

# 删除作者
@app.route('/delete_author/<int:author_id>')
def delete_author(author_id):
    # 1.通过编号获取作者对象
    author= Author.query.get(author_id)
    # 2.删除作者书籍
    for book in author.books:
        db.session.delete(book)

    # 3.删除作者对象
    db.session.delete(author)
    db.session.commit()

    # 4重定向到展示页面
    return redirect(url_for('show_page'))

if __name__ == '__main__':
    db.drop_all()
    db.create_all()

    # 生成数据
    au1 = Author(name='老王')
    au2 = Author(name='老尹')
    au3 = Author(name='老刘')
    # 把数据提交给用户会话
    db.session.add_all([au1, au2, au3])
    # 提交会话
    db.session.commit()

    bk1 = Book(name='老王回忆录', author_id=au1.id)
    bk2 = Book(name='我读书少，你别骗我', author_id=au1.id)
    bk3 = Book(name='如何才能让自己更骚', author_id=au2.id)
    bk4 = Book(name='怎样征服美丽少女', author_id=au3.id)
    bk5 = Book(name='如何征服英俊少男', author_id=au3.id)
    # 把数据提交给用户会话
    db.session.add_all([bk1, bk2, bk3, bk4, bk5])
    # 提交会话
    db.session.commit()
    app.run(debug=True)